package com.itheima.demo4;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/*
需求:
 红包雨游戏，某企业有100名员工，员工的工号依次是1, 2，3, 4，..到100。现在公司举办了年会活动，活动中有一个红包雨环节，
 要求共计发出200个红包雨。其中小红包在[1 - 30]  元之间，总占比为80%，大红包[31-100]元，总占比为20%。

 具体的功能点如下
1、系统模拟上述要求产生200个红包。
2、模拟100个员工抢红包雨，需要输出哪个员工抢到哪个红包的过程，活动结束时需要提示活动结束。
3、活动结束后，请对1到100名员工按照所抢红包的总金额进行降序排序展示，
  例如：3号员工抢红包总计：293元、1号员工抢红包总计250元，....

磊哥：应该用多线程去做，因为每个人都用自己的手机去抢，每个请求过去都是多线程的
 */
public class Test4 {
    public static void main(String[] args) throws Exception {
        // 目标：红包雨游戏。因为一个红包就一个金额，所以不建议用面向对象去做。
        // 上次那个囚犯的案例，是因为有两个信息，一个是编号一个是位置，两个信息要跟着走，位置要打乱，而且容易出bug，所以为了记住原来的位置，用对象封装是绝对优雅的
        // 1、拿红包进来。
        List<Integer> moneys = getMoneys();
        System.out.println(moneys);
        //public static void shuffle(List<?> list)：只是打乱List集合中的元素顺序。
        Collections.shuffle(moneys);
        System.out.println("--------------打乱后：---------------------------");
        System.out.println(moneys);

        // 2、创建100个员工，100个人抢就是100个线程
        //要对所有的线程对象进行总金额的排名，所以用集合存储所有的线程对象
        List<PeopleThread> peopleThreads = new ArrayList<>();

        for (int i = 1; i <= 100; i++) {
            //在同一个集合moneys里面抢红包，各个线程的名字就是索引i+号
            PeopleThread peopleThread = new PeopleThread(moneys, i + "号");
            peopleThreads.add(peopleThread);
            peopleThread.start();
        }

        // 3、统计谁抢的最多，降序排名。必须保证一百个线程执行完才可以去统计，并且要排名所有的线程对象总金额，所以要存所有的线程对象
        //主线程到了这个地方，第一次就会等第一个线程跑完，等第一个线程的时候，其他线程也在跑
        for (PeopleThread peopleThread : peopleThreads) {
            peopleThread.join();        //有异常直接抛出
        }
        System.out.println("活动结束.......");

        //对1到100名员工按照所抢红包的总金额进行降序排序
        peopleThreads.stream().sorted((p1, p2) -> p2.getTotalMoney() - p1.getTotalMoney())
                .forEach(p -> {
                    System.out.println(p.getName() + "抢红包总计：" + p.getTotalMoney());
                });
    }

    public static List<Integer> getMoneys(){
        // 1、拿红包进来。
        List<Integer> moneys = new ArrayList<>();
        Random r = new Random();
        // 2、按照权重随机红包
        for (int i = 0; i < 160; i++) {
            moneys.add(r.nextInt(30) + 1);
        }

        for (int i = 0; i < 40; i++) {
            moneys.add(r.nextInt(70) + 31);
        }
        return moneys;
    }
}
